Uprava tipu 995 z knihy 1001 tipu a triku

Otázka od: Robert Suska

10. 10. 2002 9:02

Ahojte

Mam problem z prekreslovanim TreeView a to taky ze ten priklad co je v knihe
som odpisal a tiez nechodi korektne ako som si predstavoval totiz Canvas sa
nerekresluje dobre. Upravil som kod na moju potrebu a to tak ze potrebujem
aby sa mi polozka na ktoru sa prave kliklo zobrazila ako fsBold a vsetko
ostatne aby bolo normalne vykreslene. Ono by to aj chodilo keby sa mi boldom
nekraslila aj dalsia noda pod tou ktora sa ani vykreslit boldom nemala. A
ked aj kliknem na inu nodu tak ta co bola boldom uz nieje ale na konci
riadku je este boldom vykresleny rozdiel medzi width textu boldom aj width
textu normalnym pismom.

procedure TreeViewCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var NodeRect: TRect;
begin
 with TTreeView(Sender).Canvas do
  begin
   if cdsSelected in State then
    begin
     NodeRect:= Node.DisplayRect(True);
     Font.Style:= [fsBold];
     FillRect(NodeRect);
    end
   else
    Font.Style:= []; // tu je podla knihy [fsItalic], inac ked som tam dal
aj taketo nieco Fotn.Style:= Fotn.Style - [fsBold]; ani tak to nepomohlo
  end;
end;


Viete mi niekto poradit ?

Dakujem

S pozdravom,

************************************
Robert Suska
KORAK SLOVAKIA s.r.o.
Horna 52
974 01 Banska Bystrica
www.korak.sk robert@korak.sk
Network administrator, Delphi programmer
************************************

Odpovedá: Petr Vones

12. 10. 2002 22:40

From: "Robert Suska" <delphi@korak.sk>
> Mam problem z prekreslovanim TreeView a to taky ze ten priklad co je v knihe

V jake verzi Delphi ?

Petr Vones

Odpovedá: Robert Suska

13. 10. 2002 11:20

Ahoj!

> V jake verzi Delphi ?

Delphi 6 Enterprise Update Pack #2, Windows 2000 SP3 eng.

Robo

Odpovedá: Petr Vones

13. 10. 2002 16:24

From: "Robert Suska" <delphi@korak.sk>
> nerekresluje dobre. Upravil som kod na moju potrebu a to tak ze potrebujem
> aby sa mi polozka na ktoru sa prave kliklo zobrazila ako fsBold a vsetko
> ostatne aby bolo normalne vykreslene. Ono by to aj chodilo keby sa mi boldom

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  with TTreeView(Sender) do
  begin
    if cdsSelected in State then
      Canvas.Font.Style:= [fsBold]
    else
    begin
      Canvas.Font.Style:= [];
      Canvas.Font.OnChange(nil); // Workaround
      Canvas.Brush.Color := Color;
      Canvas.FillRect(Node.DisplayRect(True));
    end;
  end;
end;

Petr Vones

Odpovedá: Robert Suska

13. 10. 2002 19:34

Ahoj!

Dakujem uz to funguje krasne aj ked nechapem vyznam toho kodu a uvital by
som keby si mi ho trochu objasnil konkretne tieto riadky

Canvas.Font.OnChange(nil); // Workaround - toto je co ???
Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu

Dakujem

Robert Suska


> procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
> Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
> begin
> with TTreeView(Sender) do
> begin
> if cdsSelected in State then
> Canvas.Font.Style:= [fsBold]
> else
> begin
> Canvas.Font.Style:= [];
> Canvas.Font.OnChange(nil); // Workaround
> Canvas.Brush.Color := Color;
> Canvas.FillRect(Node.DisplayRect(True));
> end;
> end;
> end;
>
> Petr Vones

Odpovedá: ing. Jan Fiala

13. 10. 2002 19:44

13.10.2002 Robert Suska:
> Dakujem uz to funguje krasne aj ked nechapem vyznam toho kodu a uvital by
> som keby si mi ho trochu objasnil konkretne tieto riadky

> Canvas.Font.OnChange(nil); // Workaround - toto je co ???

Jen vyvolas obsluhu zmeny fontu.

> Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu

To je barva objektu, se kterym prave pracujes, v tomto pripade
TreeView

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Petr Vones

13. 10. 2002 20:52

From: "Robert Suska" <delphi@korak.sk>
> Canvas.Font.OnChange(nil); // Workaround - toto je co ???

Chyba ve VCL. Pouziti TFont neni totiz v OnCustomDrawXXX udalostech to uplne
nejstastnejsi reseni. Pokud se podivas na implementaci tak zjistis, ze na
konci obsluhy zprav VCL slouzicich pro toto vykreslovani se testuje private
promenna FCanvasChanged (TTreeView, TListView). Pri kazde zmene vlastnosti
TFont je treba aby se pres udalost TFont.OnChange nastavila tato promenna na
True. Jenze TFont je puvodne navrzen k jinemu ucelu a ma i nejake vychozi
hodnoty vlastnosti a teprve jejich zmenou dojde k vyvolani teto udalosti a
tedy i nastaveni te promenne FCanvasChanged. V tom danem pripade ale zadne
vychozi hodnoty nejsou a je treba tuto udalost vyvolat pri nastaveni jakekoli
hodnoty, tedy i te "vychozi" jako je napriklad: TFont.Style := []. Workaround
prave spociva v explicitnim vyvolani te udalosti.

> Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu

TTreeView.Color

Petr Vones